package com.heima.homeservicemanagementsystem.utils;

import cn.hutool.core.util.RandomUtil;

import com.heima.homeservicemanagementsystem.module.Result;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @Description
 * @Author susu
 * @Date 2024/11/29
 */

@Component
@Slf4j
public class FileUtils {
    public static final String path;//文件在G盘
    public static final String targetpath;//文件在G盘
    @Autowired
    private Environment environment;
    private static ApplicationContext context;
    @Autowired
    private ApplicationContext applicationContext; // 注入ApplicationContext


    @PostConstruct
    public void init() {
        context = applicationContext; // 在实例化后初始化静态上下文
    }

    static {

        try {
            path = ResourceUtils.getURL("G:/biyesheji/project/homeServiceManagementSystem/src/main/resources/static/upload").getPath();
            targetpath = ResourceUtils.getURL("classpath:").getPath() + "static/upload/";  // 去掉第一个斜杠;
////            System.out.println(path);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }


    }
    //2
//    static {
//        try {
//            path = ResourceUtils.getURL("classpath:").getPath() + "static/upload/";  // 去掉第一个斜杠;
////            System.out.println(path);
//
//        } catch (FileNotFoundException e) {
//            throw new RuntimeException(e);
//        }
//    }


    public static String upload(MultipartFile file) {
        if (file.isEmpty()) {
            throw new RuntimeException("文件不能为空");
        }
        try {
            // 保存文件到本地系统，这里假设我们保存到"uploads"目录
            crreateMkDir(path);
            if (file.getOriginalFilename() != null) {
                String filename = filename(file.getOriginalFilename());
                // 使用原始文件名保存文件
//                ================
                String filePath = path + filename;

                String substring = filePath.substring(1);
                System.out.println("lujing" + substring);
                file.transferTo(Paths.get(substring));
//===========
                String targetfilePath = targetpath + filename;

                String targetsubstring = targetfilePath.substring(1);
                System.out.println("lujing2" + targetsubstring);
                file.transferTo(Paths.get(targetsubstring));

                return filename;
            }
        } catch (IOException e) {
            throw new RuntimeException("文件上传异常");
        }
        return null;
    }

    /**
     * public static String upload(MultipartFile file) {
     * if (file.isEmpty()) {
     * throw new RuntimeException("文件不能为空");
     * }
     * try {
     * // 保存文件到本地系统，这里假设我们保存到"uploads"目录
     * crreateMkDir(path);
     * if (file.getOriginalFilename() != null) {
     * String filename = filename(file.getOriginalFilename());
     * // 使用原始文件名保存文件
     * String filePath = path + filename;
     * <p>
     * String substring = filePath.substring(1);
     * //                System.out.println("lujing"+substring);
     * file.transferTo(Paths.get(substring));
     * <p>
     * return filename;
     * }
     * } catch (IOException e) {
     * throw new RuntimeException("文件上传异常");
     * }
     * return null;
     * }
     * <p>
     * <p>
     * /**
     * 上传多个文件
     *
     * @param files 上传的文件数组
     * @return 返回上传文件的文件名列表
     */
    public static List<String> uploads(MultipartFile[] files) {
        List<String> uploadedFiles = new ArrayList<>();

        if (files == null || files.length == 0) {
            throw new RuntimeException("文件不能为空");
        }

        try {
            // 创建目录
            createDirIfNotExist(path);

            // 遍历每个文件进行上传
            for (MultipartFile file : files) {
                if (file.isEmpty()) {
                    continue; // 如果文件为空，跳过
                }

                String originalFilename = file.getOriginalFilename();
                if (originalFilename != null) {
                    // 生成唯一文件名
                    String port = context.getEnvironment().getProperty("server.port"); // 从ApplicationContext获取环境信息
//                    log.info("端口号：{}", port);
                    String filename2 = "http://127.0.0.1:" + port + "/upload/" + generateUniqueFilename(originalFilename);
                    String filename = generateUniqueFilename(originalFilename);
                    String filePath = path + filename;
//                    log.info("文件路径：{}", filePath);
                    // 将文件保存到指定路径
                    file.transferTo(Paths.get(filePath.substring(1))); // 去掉路径的第一个斜杠

                    // 将文件名加入到返回列表
                    uploadedFiles.add(filename2);
                }
            }

        } catch (IOException e) {
            throw new RuntimeException("文件上传异常", e);
        }

        return uploadedFiles;
    }

    /**
     * 创建目录（如果不存在的话）
     *
     * @param path 目录路径
     */
    private static void createDirIfNotExist(String path) {
        File directory = new File(path);
        if (!directory.exists()) {
            directory.mkdirs();  // 如果目录不存在，创建目录
        }
    }

    /**
     * 生成唯一的文件名
     *
     * @param fileName 原始文件名
     * @return 生成的唯一文件名
     */
    public static String generateUniqueFilename(String fileName) {
        // 使用随机字符串确保文件名唯一，保留文件的扩展名
        return RandomUtil.randomString(32) + fileName.substring(fileName.lastIndexOf("."));
    }

    private static void crreateMkDir(String path) {
        File directory = new File(path);
        if (!directory.exists()) {
            directory.mkdirs();
        }
    }


    // 生成唯一的文件名
    public static String filename(String fileName) {
        // 使用 UUID 确保文件名的唯一性，并保留原始文件的扩展名
        return RandomUtil.randomString(32) + fileName.substring(fileName.lastIndexOf("."));
    }
}
